package org.example.server.AIinterface;

import dev.langchain4j.data.message.ChatMessage;
import dev.langchain4j.store.memory.chat.ChatMemoryStore;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.time.Duration;
import java.util.ArrayList;
import java.util.List;

/**
 * Redis聊天记录存储实现类
 * 使用Redis作为聊天记录的持久化存储，支持记录的增删查操作
 */
@Slf4j
@Component
@RequiredArgsConstructor
public class RedisChatMemoryStore implements ChatMemoryStore {
    
    // Redis操作模板，用于执行Redis操作
    private final RedisTemplate<String, Object> redisTemplate;
    
    // Redis中聊天记录的键前缀，用于区分不同类型的键
    private static final String CHAT_MEMORY_PREFIX = "chat_memory:";
    // 聊天记录的过期时间，设置为24小时
    private static final Duration TTL = Duration.ofHours(24); // 设置24小时过期时间

    /**
     * 从Redis中获取指定memoryId的聊天记录
     * @param memoryId 聊天记录的唯一标识
     * @return 返回聊天记录列表，如果获取失败则返回空列表
     */
    @Override
    public List<ChatMessage> getMessages(Object memoryId) {
        try {
            // 构建Redis中的键
            String key = CHAT_MEMORY_PREFIX + memoryId.toString();
            // 从Redis中获取聊天记录
            List<Object> objects = (List<Object>) redisTemplate.opsForValue().get(key);
            if (objects == null) {
                return new ArrayList<>();
            }
            
            // 将Object列表转换为ChatMessage列表
            List<ChatMessage> messages = new ArrayList<>();
            for (Object obj : objects) {
                if (obj instanceof ChatMessage) {
                    messages.add((ChatMessage) obj);
                }
            }
            return messages;
        } catch (Exception e) {
            // 记录错误日志
            log.error("从Redis获取聊天记录失败: ", e);
            return new ArrayList<>();
        }
    }

    /**
     * 更新Redis中的聊天记录
     * @param memoryId 聊天记录的唯一标识
     * @param messages 需要更新的聊天记录列表
     */
    @Override
    public void updateMessages(Object memoryId, List<ChatMessage> messages) {
        try {
            // 构建Redis中的键
            String key = CHAT_MEMORY_PREFIX + memoryId.toString();
            // 更新Redis中的聊天记录，并设置过期时间
            redisTemplate.opsForValue().set(key, new ArrayList<>(messages), TTL);
        } catch (Exception e) {
            // 记录错误日志
            log.error("更新Redis聊天记录失败: ", e);
        }
    }

    /**
     * 删除Redis中的聊天记录
     * @param memoryId 聊天记录的唯一标识
     */
    @Override
    public void deleteMessages(Object memoryId) {
        try {
            // 构建Redis中的键
            String key = CHAT_MEMORY_PREFIX + memoryId.toString();
            // 删除Redis中的聊天记录
            redisTemplate.delete(key);
        } catch (Exception e) {
            // 记录错误日志
            log.error("删除Redis聊天记录失败: ", e);
        }
    }
}